===============================================================================
                      GreenTeaSpeak 2 - Client-Changelog
                       Copyright GreenTeaSpeak Systems
                          https://www.greenteaspeak.de
===============================================================================
   + Neue Funktion oder spürbare Verbesserung
   - Fehlerbehebung oder Entferntes
   * Änderung oder Hinweis
   ! Wichtig — bitte beachten!
===============================================================================

* Hinweis: Ältere Versionsblöcke können noch englische Historie enthalten;
  neue Einträge ab 2.10.9 werden parallel DE+EN geführt.

2.11.9:

2.11.8:
- Talk-Lämpchen: bleiben nicht mehr kleben nach Mute/Deafen oder Channel-
  Wechsel; BUFFERING-Pakete verlängern Sticky nicht mehr (Markus PLAYING|STOPPING)
- Favoriten: Leerzeichen im Namen (und anderen Feldern) lassen sich wieder tippen
  — verbunden und getrennt; Renderer-PTT und der native Space-Hook greifen nicht
  mehr während Tippen / offenem Favoriten-Dialog
- Favoriten-Verwaltung: lange Listen scrollen wieder, untere Einträge bleiben
  erreichbar/editierbar
- Forum-Multilogin: Login sendet eine Installations-Device-ID; Renew löscht eine
  noch gültige lokale Sitzung nicht mehr, wenn der Auth-Key abgelehnt wird
  (mehrere PCs gleichzeitig)

2.11.7:
- ServerQuery: Erstellen funktioniert wieder — Benutzername eingeben; Passwort
  wird vom Server erzeugt und einmalig (kopierbar) angezeigt. Wie TeaSpeak/
  oldclient `querycreate` / `notifyquerycreated` (kein `window.prompt` in Electron).

2.11.6:
- Kamera- und Bildschirmfreigabe funktionieren in gepackten Builds wieder
  (Electron 44): Production-UI über privilegiertes `gts-app://` statt `file://`
  aus dem asar (Dev/`npm start` nutzte bereits http://localhost). Session-
  Permissions erlauben zusätzlich `mediaKeySystem` / `speaker-selection`;
  display-media-Fehler werden geloggt.

2.11.5:
+ Chat: Offline-/verlassene Clients lassen sich im Namens-Kontextmenü bannen (und entbannen, wenn ein Ban existiert) — per Unique ID wie bei TeamSpeak (`banadd` / `bandel`), ohne live Client-ID
+ Schwache CPUs / Voice: klarere [voice-tx]/[voice-rx]-Drop-Tags sowie UDP-Puffer- und Encode-Worker-Priorität in den gemeinsamen Natives (Win+Linux teaclient_connection neu gebaut ABI 149; siehe packages/native-bridge/VOICE-PERF.md; macOS-Packaging weiter Stub)

2.11.4:

2.11.3:
- Bildschirmfreigabe: Stream-Audio aus (oder Video-only-Start) lässt das Mikrofon
  nicht mehr stumm. Loopback wird vollständig abgekoppelt (nicht nur stumm auf
  sendrecv), ungenutzte RTC-Audio-Leitungen bleiben recvonly, und die native
  Mikrofon-Aufnahme (inkl. RNNoise-JS-TX) wird nach dem Chromium-Desktop-Capture
  hart neu gebunden — mit verzögerten Retries
+ Themen: aktives UI-Theme deaktivieren (Header „Deaktivieren“ und Zeilen-Toggle)
  und zum eingebauten Standard-Design zurückkehren
+ Erweiterungs-Katalog: Vorschau-Bilder von Plugins/Themes/Soundpacks von der API
  werden auf der Festplatte zwischengespeichert (userData/cache/catalog-images)
  und über gts-catalog-img:// ausgeliefert — Online öffnen lädt Thumbs nicht mehr
  jedes Mal neu; URL-Wechsel oder wöchentliche ETag-Prüfung aktualisiert veraltete
  Dateien
+ Chat: Namen in Server-/Channel-/Privat-Zeilen (Join/Poke/Autoren) sind anklickbar
  und öffnen dasselbe Client-Kontextmenü wie Rechtsklick im Channelbaum; offline/
  bereits getrennte Clients öffnen weiter ein UID-Menü (Chat, Nick/UID kopieren,
  Freund/Block, Kontakte)
- Chat ist wieder pro Server-Tab getrennt (wie oldclient handlerId-Conversations);
  Tab-Wechsel mischt keine Verläufe mehr, und Channel-Nachrichten landen nicht
  mehr durch Race-Conditions in einem offenen Privat-Chat
+ Einrichtungs-Assistent beim ersten Start (Nickname, optional myGreenTeaSpeak-
  Login, Mikrofon und Lautsprecher) — einmalig auf einer frischen Installation,
  analog zum klassischen Client
+ Platzhalter-Nicknames („Another GreenTeaSpeak user“, „Standard Identität“ /
  „Standart Identität“ und ähnliche Defaults) fragen vor dem Verbinden nach einem
  echten Nick; auch wenn die Standard-Identität noch aktiv ist

2.11.2:
+ Aufnahme: einstellbare ausgehende Rauschunterdrückung (RNNoise WASM) mit eigenem
  Stärke-Slider unter Einstellungen -> Aufnahme -> Digitale Signalverarbeitung;
  0% = aus, höhere Werte = stärkeres Denoising (Tastatur/Lüfter). Native TeaSpeak-
  RNNoise-apply_config bleibt deaktiviert (Crash in diesem Build)
+ Channel-Info-Panel zeigt die numerische Channel-ID (cid); Klick zum Kopieren
* Runtime: Electron auf 44.5.1 aktualisiert (Chromium 152, Node 24, ABI 149);
  electron-builder 26.x. Darwin-TeaSpeak-Natives müssen für ABI 149 neu gebaut
  werden, bevor Voice funktioniert (NODEJS_VERSION=v44.5.1)
- Mikrofon: Verbinden in einem neuen Server-Tab beansprucht das Mikro auf dem neuen
  Tab und stummschaltet den/die anderen Tab(s); Toolbar-Mute aktualisiert sofort;
  Aufheben der Stummschaltung beansprucht weiter exklusiv das Mikro (andere Tabs stumm)
* Start: kein Marken-Bootsplash — Hauptfenster bleibt bis ready-to-show verborgen
  und nutzt den App-Hintergrund, damit der Kaltstart direkt die Client-Oberfläche
  zeigt; „API nicht verfügbar“ erst nach Timeout (Browser-only / Fehlkonfiguration)

2.11.1:
+ Soft-3D: Ein Plugin kann räumlichen Sound wieder einschalten. Leute innerhalb
  der Sprachreichweite sind hörbar, Leute außerhalb oder ohne Position werden lokal
  stummgeschaltet. Die eigene Client-Lautstärke bleibt erhalten. Solange das Plugin
  3D steuert, ist der Punkt im Extras-Menü aktiv und das 3D-Raster gesperrt
- Datei-Browser, virtuelle Server-Verwaltung und Channel-Bearbeitung bleiben an dem
  Server-Tab, von dem sie geöffnet wurden. Der sichtbare Tab kann wechseln, ohne dass
  Speichern oder die Channel-Liste auf den anderen Server springen. Ist der Tab weg,
  schließt sich das Fenster
+ Plugins können Channel-Wechsel, Nickname, Stummschalten anderer Nutzer und den
  Verbindungsstatus auch auf einem Server-Tab im Hintergrund ausführen. Ohne
  connectionId gilt weiter der gerade offene Tab

2.11.0:
- Channelbaum: lokal stummgeschaltete User zeigen das TeamSpeak-Symbol
  (durchgestrichenes Mikro), solange die lokale Stummschaltung aktiv ist
+ Plugin-SDK: connection.getState() liefert jetzt Nickname und aktuellen Channel
  (ch-ID) des lokalen Users, damit ein Plugin beides speichern und später
  wiederherstellen kann

2.10.9:
- Obere Toolbar: Aktions-Icons (Mikrofon, Lautsprecher, Aufnahme, Abonnieren, Abwesend,
  Bildschirmfreigabe, Host-Button) von 16 auf 18 px vergrößert — besser lesbar, Button-
  Hitbox unverändert
- Einladungs-/Connect-Links (gts2server://, ts3server://): ein „+“ im Token/Passwort
  wurde beim Parsen zu einem Leerzeichen (und ein führendes „+“ ganz verschluckt),
  sodass Base64-Werte wie „+cH9…“ kaputtgingen und der Beitritt scheiterte — „+“
  bleibt jetzt erhalten
+ Changelogs: Stub-Dateien unter github/changelog/ (macos.de.txt / macos.en.txt) für ein
  künftiges macOS-Paket; Client würde darwin + UI-Sprache wählen
+ UI-Themen: bearbeitbare User-Vorlage (resources/themes/_user_template) mit theme.css /
  theme.json; Einstellungen → Erweiterungen → Themen → „Aus Vorlage anlegen…“ kopiert
  sie nach userData/themes, aktiviert sie und öffnet den Ordner zum Bearbeiten
* UI-Themen: mitgelieferte User-Vorlage ist jetzt ein LCARS-Theme (schwarzer Void,
  Peach/Cyan/Teal/Gold/Lavender, flache CSS-Variablen)
+ Aufnahme: Start/Stopp der WAV-Aufnahme spielt jetzt einen Soundpack-Hinweis
  (recording.started / recording.stopped); der eigene Aufnahmestatus wird über
  client_is_recording gesendet, sodass alle im Channel „Aufnahme gestartet/beendet“
  hören und sehen, sobald der Server das Flag weiterleitet (TeamSpeak-artige Meldung)

2.10.8:
- Crash reporter: quote Electron/exe paths in the native crash callback so
  installs or repo paths with spaces (e.g. "GreenTeaSpeak 2", "GTS2 Client")
  actually launch the crash-UI after a dump

2.10.7:
- Updater: restore Version.isDevelopmentVersion() removed by the SemVer-first
  compare change — without it refreshUpdaterStatus threw and the UI stayed on
  "Checking…" / "Wird geprüft…" forever (no up-to-date, error, or available state)
* Updater: wrap the full update-check path so unexpected errors and API timeouts
  always leave "checking" with a clear error message (incl. timeout copy)
* Updater UI: if the refresh IPC rejects without onStatus, show an error instead
  of infinite checking; German up-to-date title → "Client ist aktuell"
- Updater: SemVer is authoritative — same X.Y.Z no longer offers an update when
  the local build timestamp is already >= remote (timestamp only matters for
  same-SemVer rebuilds; never force a SemVer downgrade via a newer stamp)
- Linux/Windows folder-update: always sync app-info.json + ChangeLog.txt into
  install root and resources/ so the next check matches the shipped package
* loadAppInfo: also read resources/app-info.json (deb/extraResources); pick the
  newest candidate so a stale root stamp cannot re-prompt after a successful update
* Linux/Windows release scripts + electron-builder extraResources: ship app-info.json
  and ChangeLog.txt next to the asar (not only inside it)

2.10.6:
* Elevation prompt copy: mention /opt and polkit (not Windows-only wording)

2.10.5:
- Linux updater: accept linux-unpacked/greenteaspeak2 (and AppImage) packages instead of requiring Windows Setup.exe; apply folder-update via in-place copy after quit
* Repo: gitignore local `secrets` file (never commit upload credentials)

2.10.4:
- Soundpack download: extract ZIP/.ts3_soundpack via unzip (GNU tar cannot open ZIP —
  "Das sieht nicht wie ein tar-Archiv aus"); reject HTML error pages
- Multi-tab voice: keep native playback bind on a connected tab while a new tab
  is still connecting; rewarm VoiceClients after attach/rebind (fixes dead output
  on new-tab connect); exclusive mic mute on other tabs when an additional unmuted
  tab is spawned
* .gitignore: keep native/build/linux_x64 (and win32_x64) explicitly tracked
- Linux CI: dist-linux-docker no longer auto-mounts/probes a Windows teaspeak-bundle
- Connect: clientupdate client_platform follows host OS (Linux/macOS/Windows)
  instead of always announcing Windows
* gts2 API: beta/nightly download URLs use release-{arch}.tar.gz (same deploy
  archive name as Windows; channel = version-folder suffix b/n)
* Runtime: logs expected NODE_MODULE_VERSION on native load failure

2.10.3:
- Video: camera/screen broadcast keeps running on the server where it was
  started when switching connection tabs — TX is bound to the owner
  connection (not UI focus); toolbar shows sharing only on that tab
* Settings: rename Forum nav to myGreenteaspeak and move it to the top of
  General (Allgemein); remove empty Identity section
* Settings: myGreenteaspeak page title/copy (was Forumverbindung); show
  account email on the connected card when the forum API provides it; use
  the GTS2 app icon for the myGreenteaspeak nav entry

2.10.2:
- Audio: headset / default-device hotplug — soft-rebind capture+playback when
  WASAPI devices disappear or return (no full app restart); capture health
  pokes start() so stream_invalid recovers while send stays enabled
- Talk lamps: peer indicators stay off while BUFFERING|STOPPED; packet hints
  no longer refresh BUFFERING into a Dauerlampe; callback_playback only lights
  when already audible (PLAYING|STOPPING)
+ Audio (Darwin): native Core Audio HAL path; miniaudio refused on macOS

2.10.1:
- Away: status no longer clears when switching connection tabs — each tab keeps
  its own away flag/message; toolbar Away follows the focused tab; All servers
  applies to every open connection
- Video: watching another client's camera/screen while your own camera is on
  works again — Markus-style extra recvonly video m-lines, canvas fallback
  SSRCs on camera/screen slots, local ICE buffered until the remote
  description is set, and soft-ignore of UnknownMediaChannel (1792) ICE races
- Channel video: hide own broadcast from the remote watch list (local preview
  only), matching Markus LocalClientEntry filtering
- Video watch: stop leave+rtcsessionreset loop — trailing empty
  notifybroadcastvideo rows no longer wipe the channel list mid-watch; UI
  debounces vanish; no double leave/reset (fixes ICE Unauthorized / bad
  local username storm after join)
- Poke (Anstupser): multi-poke received window — card rows with avatar
  initials, clearer nick/time/message hierarchy; scrollbar only when needed
- Poke (Anstupser): stay above the main window when the client is already in
  the foreground (owned/modal child + AOT; no flash-main race before show)
- Screen share: system/desktop audio actually reaches peers — after loopback
  capture, send TeaSpeak `broadcastaudio` with the audio SSRC (Markus path);
  prior fix attached the track locally but never started the channel broadcast
- Screen share: capture video via chromeMediaSourceId and loopback via a
  separate getDisplayMedia grant (Windows window+loopback was silent/empty)
+ Icons: flood/antiflood throttle plus quieter connect (fewer icon storms)
+ Talk status: Markus-aligned peer indicators (PLAYING|STOPPING); PTT
  send-enable so local talk lamp matches actual TX
+ Voice: multi-tab exclusive TX — unmute claims one speak tab; UI focus may
  stay on another muted tab (Markus-style work Tab1 / speak Tab2)
+ Audio: playback amplifier setting for louder remote voice
+ Server admin: Alle Clients list; Ban list CRUD; Nachrichten presets
  (away / kick / ban texts)
+ UI: modern kick/ban dialogs with ban preset picker
+ Connection: middle-click connection info; notifyconnectioninfo wait fix
+ Channel tree: moderated-channel icon (client-moderated with M badge)
- Client hang: softer command-path probe (less aggressive whoami recovery)
- News ticker: soft-fail so a bad feed no longer blocks the UI
- CSS: global.css truncation fix (styles no longer cut off mid-rule)

2.10.0:
* Initial 2.10.x line after 2.9.9 carry; release notes continued under 2.10.1

2.9.9:
* Release skipped in semver sequence (patch max 9 carried 2.9.9 → 2.10.0);
  notes shipped under 2.10.0 / 2.10.1

2.9.8:
- Voice: rebuild Opus without OPUS_X86_PRESUME_SSE4_1 (RTCD only) and bypass
  WebRTC AudioProcessing::ProcessStream on capture — fixes remaining
  STATUS_ILLEGAL_INSTRUCTION (0xC000001D) on talk after 2.9.7 AGC-off path
  (repro: Opened WASAPI capture → encode queue → crash in teaclient_connection)

2.9.7:
- Voice: fix main-process crash when starting to talk (STATUS_ILLEGAL_INSTRUCTION
  0xC000001D in teaclient_connection) — stop applying FixedDigital WebRTC capture
  AGC; disable AGC/AEC/NS/VAD on capture so SSE4.1 process paths are not forced
  on CPUs that abort there (repro: PTT/unmute → Opened WASAPI capture → crash)
- Channel tree: multi-select / multi-move hold-key works again with side-specific
  bindings (Alt Links / Strg Links) — captureBinding stored altleft/ctrlleft but
  the matcher only accepted bare alt/ctrl; also ignore Dead-key mis-captures

2.9.6:
+ Plugins: Tools menu lists installed UI plugins; Soundboard plugin sends WAV
  clips into the voice channel (mic TX mix, local monitor, hotkeys)
+ Channel tree: drag-and-drop channel reorder/move with server sync
+ Talk status: multi-user talk lamps stay reliable (voice-packet activity +
  sticky talk-indicator watchdog)
+ File browser: download/rename/delete, drag-and-drop upload, multi-select,
  progress, and dedicated Electron window
- Audio: Opus corrupted-stream / whisper UID handling; clearer outbound mic
  (capture DSP + higher Opus send bitrate)
+ Icons: country flags in the client tree/info panel from local SVG map
+ UI: TeamSpeak-style brand watermark in the info panel and chat log

2.9.5:
+ Crash dialog: optional upload of minidump plus the last two client logs to
  https://greenteaspeak.de/bug-report (multipart form; best-effort, no secrets)
* Natives: Electron 33 ABI 130 rebuild includes VoiceClient force_replay UAF
  fix (ACCESS_VIOLATION on duplicate stop / stream-timeout packets)

2.9.4:
+ Icons: server group menu icons load via MenuIconLoader with SHA1 disk cache
  (faster reopen, fewer duplicate downloads)
+ Audio: WAV recording of mic + remote mix for local capture/review
- Settings: crash-safe prefs — atomic JSON writes (temp+rename) plus .bak
  restore so a mid-write crash no longer resets audio devices / identities /
  bookmarks to defaults; corrupt files are quarantined, never wiped silently
- Talk lamps: packet-primary hang no longer leaves peer lamps stuck on
- Connection: command-path recovery — whoami probe before connection-lost;
  getconnectioninfo / clientmove timeouts handled without false disconnects
- Audio: Opus corrupted-stream / whisper UID fix; native log rate-limit for
  spammy decode errors
- Voice: fix main-process crash (ACCESS_VIOLATION in teaclient_connection) when
  an old/duplicate stop or stream-timeout packet deleted a buffer still held by
  force_replay — clear force_replay before delete
* Natives: Electron 33 ABI 130 (teaclient_*.node) required for GTS2

2.9.3:
- Update: refuse GTS1 / legacy packages on the GTS2 API (GreenTeaSpeak1-Setup,
  GTS1 - Legacy.exe, app-info major≠2) so a wrong deploy cannot overwrite GTS2

2.9.2:
- Talk status: multi-user talk lamps stay reliable via voice-packet activity
  plus a sticky talk-indicator watchdog (peers no longer stick on/off incorrectly)
- Audio: clearer outbound mic (less woolly/muffled) — capture DSP policy
  (FixedDigital AGC; AEC/HPF/AGC2 off) and Opus send bitrate 96 kbps
- Icons: after upload, cache put / forget disk so tree badges refresh without
  a stale HTTP/icon cache hit
* Natives: teaclient_*.node must be built for Electron 33 (ABI 130); wrong ABI
  yields "Module did not self-register" under GTS2

2.9.1:
- Audio: mic not sending after reconnect — detach/rebind capture and force
  send-state sync so transmit resumes after reconnect
+ Settings: custom disconnect/quit message
- Update: pass /allusers|/currentuser to Setup; re-stamp shortcut AppUserModelID
- Settings: do not overwrite saved mic/headphones when native audio falls back
  to default after update; pin userData to `%APPDATA%\GreenTeaSpeak 2` (migrate
  legacy `greenteaclient` folder if present)

2.8.9:
- Away: status and message persist after the idle timeout fires (no longer
  cleared when the away timer expires)
- Away: enabling Away mutes the microphone; unmute is blocked while Away is
  active so the client cannot send audio in Away state
- Info panel: fall back to server info when channel details are unavailable
- Talk lamp: sticky own-client talk indicator watchdog so the lamp cannot
  remain stuck on after send stops

2.8.8:
- Audio: Chromium getUserMedia mic/echo tests disable autoGainControl so they
  cannot rewrite the Windows microphone mixer level
- Audio: device remapping no longer strips "(Brand …)" from labels — fixes
  false WASAPI remaps (e.g. RODECaster Chat→Main, Realtek→RODECaster) that
  caused quiet send and "no remote sound" on the wrong output
- Logging: filter native playback-state / fadeout spam; support logs keep
  device/volume/error lines; connection channel moves stay UI-only

2.8.7:
+ Screen share: optional system audio (Windows/Linux loopback) with the share —
  Discord-like default toggle; camera share never includes it
+ Screen share: switch window/screen mid-session via replaceTrack without full
  hangup (toolbar / Change opens picker; Stop stays on the preview)
+ Screen share: enable/disable share audio while broadcasting; viewers can
  mute/unmute remote share audio independently (autoplay stays muted until unmute)
- Talk lamp: own client indicator in the channel tree follows mic send again
  (continuous / PTT / VAD); uses configured Talk-Lämpchen color
- Talk lamp: switching continuous↔VAD while unmuted no longer leaves the own
  lamp dark or stuck on; device/audio restart no longer clears it after restore
- Talk lamp: server mute/talking echoes no longer overwrite the local own-client
  talk/mute state
- Tray: while talking the notification-area icon is replaced by a TeamSpeak-style
  talk-lamp orb (Talk-Lämpchen color); normal logo when idle, gray when
  muted/deafened; tooltip includes Talking / muted / deafened

2.8.6:
- Permissions: send permvalue as signed int32 (oldclient `value | 0`) so setting
  a server/channel group icon (i_icon_id CRC32 > 2^31-1) no longer kicks with
  "Invalid argument (failed to parse permvalue as i (stoi))"
- Permissions: after creating or renaming a server/channel group, refresh the
  open permission editor group list immediately (no close/reopen)
- Camera/video UX: remote watch tiles stay muted for Chromium autoplay (no more
  black preview); failed Watch leaves the server broadcast again (no orphan join)
- Camera/video UX: channel bar grid shows only streams you watch (chips still
  discover everyone); clearer empty hint instead of idle black tiles
- Camera share: live mirrored picker preview; denied/busy/missing camera errors
  instead of “no camera”; stop orphan tracks on start failure / unmount / disconnect

2.8.5:
* Build for updater verification (no functional changes)

2.8.4:
- Updater: log real Start-Process / spawn errors to the client log file
- i18n: updateInstallerStartFailed / updateInstallerMissing use real newlines
  (no literal \n in the error dialog)

2.8.3:
- Setup finish/update relaunch now uses ExecShellAsUser so an elevated installer
  cannot spawn GreenTeaSpeak 2.exe as administrator (false "UAC at client start")

2.8.1:
- Updater: when Release channel has no packages, fall back to beta so the client
  is not stuck with "no updates" while Release is empty on the API
- Updater: compare build timestamps so same-semver rebuilds still offer an update

2.8.0:
- Antiflood: throttle/serialize server icon downloads (max 2 parallel, start gap,
  backoff on temporary FT failures); do not remount-retry 2051/flood errors
* Signed icon path retry on 2051 still applies, with a short delay between forms
- Voice: stop rewarming the full peer roster on every mute/PTT/send sync (was
  logging "rewarmed N … after audio restart" dozens of times per minute); rewarm
  only after a hard audio backend restart, coalesced
- Flood ban (3331): never auto-reconnect on ban/flood; show banned notice; if a
  reconnect is scheduled for other reasons, wait until ban expiry when parsed
- Updater: resolve PowerShell via SystemRoot (packaged PATH), await spawn success
  before exit, shut down voice/sessions before apply, surface start failures to
  the updater window instead of silently quitting

2.7.9:
- Server/group icons: on FT error 2051 (file not found), retry download with the
  int32 signed path form (`/icon_-N`) when the CRC32 id has the high bit set —
  classic TeamSpeak signed-vs-unsigned mismatch; do not cache 2051 until both forms fail
* Icon download warnings now include host, port, path, and error id
- Icon file list accepts signed `icon_-N` names from ftgetfilelist
* ftinitdownload/upload send empty `path=` like the oldclient (name still holds `/icon_…`)

2.7.7:
* Updater: one-click happy path (download + apply, no second “Apply update” step); simpler progress copy; channel options moved under Advanced
* Desktop main process respects UI language (tray, native dialogs, window titles, VoIP/crash dialogs, disconnect notices)
- Server/channel/client icons load on servers with a non-default file transfer port (same notifystart* port path as channel files; retry instead of caching FT failures)

2.7.6:
+ UI languages: 10 locales (de, en, nl, pt, hu, es, ru, it, tr, pl) — language setting switches the full interface (menus, settings, dialogs, tray, connection logs)
* Language preference stores a stable locale code; OS language is used on first launch
- Voice: stop thinning peer jitter to 60ms (UI default / first volume edit); use 100ms and ignore live volume ticks on the hot path — cuts intermittent underflow fadeouts ("wolliger" / muffled peer audio)
- Voice: Opus FEC decode flag actually passed to opus_decode_float (was hardcoded 0 in the shipped native tree)
+ File transfer: auto-detect FT TCP port from server notifystart* (uses whatever the server configured — e.g. 30033 / 30303 / custom; last-resort fallback 30303 only if omitted)

2.7.5:
- Voice: enable Opus FEC on decode (was hardcoded off — one lost packet became an audible glitch)
- Voice: large packet-ID gaps (late join / rewarm) resync cleanly instead of "missing 12000 packets"
- Protocol: increment command resend_count (was never increased → endless "Resending 1 packets" for hours)
- Protocol: grow command reassembly buffer 32→128 (reduces underflow drops on long sessions)
- Protocol: match command ACKs by packet id & 0xFFFF (generation-safe)
- Uninstall/reinstall: force-kill "GreenTeaSpeak 2.exe" (tray) on init/install/uninstall so a leftover process cannot stay running after remove or during reinstall

2.7.4:
- Updater: wait for client PID exit before copy; relaunch EXE after update
+ Server group dialog: assignment window with checkboxes (not the permission editor)
- Log filenames use local time instead of UTC (fixes 23:25 names at 01:25)

2.7.3:
- Soft 3D: hard-block spatial peer volume at native layer (no distance duck / "wool blanket" / sock-in-mouth path)

2.7.2:
+ Updater: client relaunches automatically after update (Finish page skipped)
- Context menu: show server/channel group icons next to group names

2.7.1:
* Soft 3D / spatial gain fully disabled (kill switch) until muffled-audio investigation is done
- Connect: serialize all connects; replace same-server tab instead of spawning a second session (fixes Sweety/Sweety1 doppel-connect)
- Weblist connect: use selected identity / forum handshake (no anonymous second UID)
- Reconnect: block parallel resume+timer handshakes

2.7.0:
- Fixed: jitter buffer (80ms) was never actually applied due to wrong set order (max must be set before min); this caused constant near-zero buffering and frequent underflow fadeouts ("wool blanket" / muffled sound on peers)
* Update channel: Release channel is now available and selectable in settings

2.6.9:
- Playback no longer resets the jitter buffer on every volume tick (fixes intermittent muffled/"wool blanket" peer audio)
* Soft 3D: clear leftover spatial gains on connect when no plugin owns spatial; UI still does not drive audio

2.6.8:
- Soft 3D no longer ducks other users' volume in normal voice use; spatial gain only applies when a plugin (e.g. SaltyChat) drives it
* Soft 3D dialog: placement preview only; audio stays off until a plugin locks spatial
* Soft 3D persist: do not auto-enable from spatial-3d.json; remap placements by nickname

2.6.7:
+ Plugin runtime: install/enable plugins via Extensions (catalog ZIP or local folder)
+ Soft 3D / spatial voice engine and Extras → 3D Sound dialog (AFK placement)
+ Server Unique ID shown in the info panel and copyable from the context menu
+ Online catalog can download plugins (e.g. SaltyChat) separately from sound packs
* Server license labels: NPG (Non-Profit Gamer), CGL (Community Gamer License), AGHP (Authorized GreenTeaSpeak Host Provider)
- Audio Apply while connected: soft device switch instead of tearing down VoiceClients (no more silent peers until rejoin)
* Plugins are not shipped inside the installer; SDK is for developers only

2.6.6:
* Ship bundled sound packs as real files under resources/soundpacks (extraResources) so updates replace Speech Male/Female stereo WAVs for installed clients

2.6.5:
+ Sound pack catalog preview images are saved locally and shown for installed packs
+ Poke dialog: right-click copy/select-all; links in poke messages are clickable
* Bundled Speech (Male) / Speech (Female) sound packs converted from mono to stereo

2.6.4:
- Favorites: name collisions get (1)/(2) suffixes instead of doubling the label
- UI stays usable on server timeout / reconnect (disconnect, cancel, favorites)

2.6.3:
* Update channel: Beta is the default; Release stays grayed out until UPDATE_RELEASE_CHANNEL_ENABLED is flipped
- Sound pack selection from the online catalog survives restart and updates (hydrate, catalogId, download fixes)
- Mass move: coalesce leave/join/moved sounds (no triple spam; at most one cue after bulk)

2.6.2:
- Suppress whisper error 1804 spam when there are no whisper targets; stop sending on empty targets
+ Faster domain:port connect (skip TSDNS/SRV TCP probes for explicit host:port; DNS/status cache)
* Channel [*spacer…] repetitive spacers match oldclient behavior

2.6.1:
- Incoming whisper audio playback fixed (VOICE_WHISPER receive)
+ Remote whisper talk lamp in channel tree
* Whisper receive notification sound uses short soft shush (pissst) instead of chat ding

2.6.0:
+ Whisper lists with hold hotkeys (PTT-style; VAD ignored while whispering)
+ Whisper settings (Audio → Whisper): incoming rights, sound, history panel
* Whisper receive cue uses short soft shush (whisper_notify), not chat ding
+ Contacts: right-click friend/block, contacts dialog, custom display names
+ Configurable talk-lamp colors for Whisper and Channel Commander
+ Channel description and topic shown in the info panel
+ Undocked channel tree: “fold main window” keeps the tree open (X still quits)
- Fix alien/robot mic pitch on high sample-rate capture devices
- Fix native crash in audio event queue (null weak_ptr on disconnect/exit)
- Whisper no longer spams whisper.list.empty; empty sound removed
- Channel switch no longer plays a barrage of join sounds or false channel-edit sounds
- Duplicate permission error on failed client move removed
* Contacts show as [Custom Name] Nickname (no friend sphere icon)

2.5.9:
+ Light and dark theme support across the client UI
+ Talk lamp: idle state uses a darker color for clearer speaking feedback
+ Events and notifications wiring improved
+ Chat timestamps show the date; chat font size setting applies correctly
+ Screen and camera picker modernized; camera background blur and image options
- File browser no longer shows a duplicate title
- Fix bot:get-settings request handling
- Video UI styling corrected for light mode
* Screen/camera share performance improvements

2.5.8:
+ In-app browser (BrowserView): back/forward/reload; same URL re-opens with hard refresh
- Away-with-message dropdown works again when the info panel is hidden (tree-only layout)
- Channel tree colors: current channel blue, password yellow, full red (was inverted)
- Connect / homepage / weblist: use identity or last nickname instead of the default placeholder
- Push-to-talk: Left and Right Ctrl can be bound separately
- Move sounds no longer play two or three times for one client move
- File transfer finished sounds (upload/download)
- Native voice: auto-register speakers, 80ms jitter default, separate encode/decode threads (multi-speaker quality)
- Sound pack selection from the online catalog persists across updates
* Forum session soft-renew on startup after client updates
* Profiles: identity display name labeled as Nickname for new connections

2.5.6:
+ Server edit dialog: modern GTS2 layout with sidebar categories (General, Host, …)
+ Permission editor: modern GTS2 shell, sidebar navigation, window-filling layout
+ Group members: add clients via clear modal (DB-ID or Unique ID) instead of cramped inline fields
- Server edit: default groups selectable by name; server nicknames display-only in the dialog
* Permission editor primary actions use GTS2 green styling

2.5.4:
- Connect: "Connected" status appears immediately after the channel list loads; roster subscribe runs in the background
- Sound packs: connect chime plays right away (no wait for imported-pack scan); only connection.connected on join (no spurious channel.edited during bootstrap)
- Permission editor: fixed blank window, flickering, and duplicate loading; cache-first group list and stable tab switching

2.5.3:
- Updater: apply update exits immediately so the installer or in-place copy can replace locked files (fixes update not starting after apply)

2.5.2:
- Audio: remap legacy native device ids (ma-out:/ma-in:) by device name; fall back to default instead of invalid device id on apply
- Microphone settings: native level meter for mic test when using miniaudio (live level bar works again)

2.5.1:
- Sound packs: play via stable HTML audio on the configured output device (Chromium setSinkId with native device name mapping)
- Sound packs: no longer use native playback_sound path (fixes cut-off, stutter, and crash on long sounds)

2.5.0:
+ Channel file browser: context menu for download, rename (F2), and delete
+ Hotkeys: multi-client selection / multi-move hold key is configurable (any key or modifier; default Alt)
- Permission editor: integer/grant fields are editable again; active tab scopes rights (no mixing across tabs)
* Extensions browser UI cleaned up (toolbar, list rows); Themes/Plugins remain disabled for now

2.4.9:
+ Settings → Extensions: browse and download sound packs from greenteaspeak.de (online catalog with install progress)
+ Only Speech sound packs ship with the installer; Kleiner Nils, Military (English), and GTS2 are available via the online catalog
* Themes and Plugins categories are shown but disabled until supported

2.4.8:
+ Bundled sound packs: Speech (Male), Speech (Female), Kleiner Nils (by Struppi), and Military (English)
+ sound packs: GTS event mapping generated from settings.ini (join/move/chat sounds work correctly)
- Sound pack event sounds are suppressed while deaf (speaker off)
- Fix startup crash when loading imported  sound packs (mapping module bundled in main process)

2.4.7:
+ Multi-client move: Ctrl+drag over clients to add to selection; own client can be included and moves with the group
+ Bulk move plays the move sound once instead of once per client
- Channels are no longer included in Ctrl+click or Ctrl+drag multi-selection
- Bundle MSVC runtime DLLs (vcruntime140, msvcp140) so native modules load on PCs without Visual C++ Redist
- Fix connection log language helper import on startup

2.4.6:
+ VoIP blacklist check via license server (SRV/DNS resolve to IPv4, API true/marked/false)
+ Blacklisted servers: warning dialog, red session log entry, connection rejected
+ Marked (suspicious) servers: warning dialog with Continue/Cancel; red log entry
- Blacklist warning shows again on each new connect attempt; no IPC error stack trace on reject
- Server chat tab (server-root) can no longer be closed

2.4.5:
+ File browser: rename files and folders (F2), drag-and-drop upload
+ Move multiple clients at once (Ctrl+click selection, context menu, drag-and-drop)
+ Close any chat tab including channel chats; close all chats from context menu
+ Application language auto-detected from OS on first start; connection log messages in German or English
+ Sound pack changes apply immediately without restarting the client
- Fix duplicate connection log line when a client is moved (single notifyclientmoved entry only)
- Fix avatars not loading or uploading (missing avatarBufferToDataUrl helper)
- Fix default avatar silhouette visible behind a custom avatar image
- Fix parallel connect attempts causing identity-already-online (521) errors on reconnect

2.4.4:
+ Invite friends from Extras menu or server/channel context menu (gts2server link, HTTP redirect, HTML snippet)
+ Portable edition can launch the bundled installer to install GreenTeaSpeak 2 permanently
- Fix portable client using the same user data folder as the installed app (single-instance lock / silent exit)
- Fix client failing to start after portable-install changes (missing AppInfo import)

2.4.3:
+ Status bar news ticker from greenteaspeak.de (scrolling text with pause between cycles; auto-refresh every 30 seconds)
+ Status bar display options (nickname, identity, ping, server address, connection quality) persist across restarts
- Fix selected microphone and output device not restored after restart — preferences saved to disk and merged on startup
- Fix client volume above 100% (+dB) not making other users audibly louder

2.4.2:
- Fix host banner displayed too small above the channel tree (removed 96px height cap; oldclient banner modes restored)
- Fix own talking indicator staying lit permanently with voice activation (VAD) when not speaking

2.4.1:
- Fix talking indicator stuck on after voice activation (VAD) — server talking flag no longer overrides native playback state
- Fix push-to-talk talking indicator flickering off while the key is still held
- Fix no voice after switching headphones/output device — native device matched by saved name, voice clients re-registered after audio restart, output device applies immediately from settings

2.3.9:
- Fix sound pack and UI sounds playing on the wrong output device (e.g. TV instead of headphones) — route HTML5 audio via setSinkId using device name matching and persisted browser sink ID
- Fix mojibake in connection log / chat system messages (German umlauts and quotes displayed as garbled text)
- Fix forum identity fallback on foreign TeaSpeak servers: when the server rejects the forum handshake, automatically reconnect with the GreenTeaSpeak identity instead of failing with a misleading login error
- Fix forum badges not appearing after switching from forum to normal identity (badges re-synced on connect and tab switch)
- Fix talking indicator (blue glow) showing for clients in other channels — only peers in your own voice channel are highlighted now
+ Channel tree popout window (oldclient-style) with hover button in the channel tree
+ View preferences persist (toolbar, server tabs, status bar, master volume, host banner, info panel)
+ Info panel (right) can be hidden for compact layout; tree stays visible
+ Compact window mode (480px fixed width) when info panel is hidden

2.3.8:
- Fix remaining startup paths that still opened native audio (bootstrap native status, sound-pack output routing)
- Audio settings use browser device list only (no miniaudio in settings); native voice opens on server connect; device names matched by label

2.3.7:
+ Native crash dump reporter (Tea[*]Speak-style): minidump + crash window with dump path on main/renderer crash
+ Dev: `npm run crash-test` triggers a test crash and opens the reporter window

2.3.6:
- Sound pack + UI sounds route to the configured output device (setSinkId), not always system default speakers
- Deafen also mutes the microphone (TeamSpeak-style); undeafen restores mic unless it was muted before

2.3.5:
- Import Tea[*]Speak 3 soundpacks (folder / .zip / .ts3_soundpack with settings.ini) or native GTS2 packs in Settings → Sounds
- Sound Pack as nested submenu under Selbst (Tea[*]Speak-style), with checkmark on active pack
- Drop-in soundpack folders: create/open folder under userData/soundpacks, drop WAVs or settings.ini — auto-detected on refresh
- Favorites: allow multiple bookmarks for the same server address with different names
- Fix Connect dialog: Verbinden waited until after window.close() and never started the connection
- Toolbar: Away → Mute → Deaf → separator → Subscribe → Screen → Camera; Connect / Server list / Disconnect only under Verbinden menu
- Fix Serverliste menu icon (was same as Verbinden; now client-weblist)
- Fix Beenden / Strg+Q / window X: fully quit (no hide-to-tray on close)
- Fix identity import security level (wrong TomCrypt public-key flag showed 0; export now keeps hash-cash offset)
- Fix profile avatar: show uploaded image immediately (preview returned from upload)
- Fix microphone activation threshold at startup: apply saved settings before bootstrap and sync VAD on connect
- Fix Push-to-Talk: no longer auto-mutes when enabling PTT or on startup (idle PTT ≠ muted)

2.3.4:
- Fix global Push-to-Talk in background via WH_KEYBOARD_LL in main (works unfocused/tray; no RIDEV_NOLEGACY freeze)
- Fix PTT when binding is Ctrl/Alt/Shift (map L/R modifier VKs; no GetAsyncKeyState inside hook)
- GetAsyncKeyState 10ms poll backup (Discord-style) if LL hook is starved
- System tray like Tea[*]Speak: X hides to tray; double-click / menu to show; mute, disconnect, quit from tray

2.3.3:
- Fix global Push-to-Talk in background: run teaclient_ppt in an Electron utilityProcess (renderer was throttled when unfocused; main RIDEV_NOLEGACY freezes UI)

2.3.2:
- Local client/bot volume: oldclient-style dB dialog for users; re-apply native VoiceClient volume when clients talk
- Global Push-to-Talk outside the window via teaclient_ppt in preload (not Electron main)
- License badge: only servers with version like `2.5.1 [Build: …]` are GreenTeaSpeak; `TeaSpeak 1.4.x…` shows "Kein GreenTeaSpeak-Server"
- Tidy client context menu: nest Info / Move / Moderation / Audio; shorter labels

2.3.1:
- Wire Sprachlautstärke (and Aufnahmelautstärke) to native playback/capture volume — slider previously only wrote localStorage

2.3.0:
- Push-to-Talk / voice idle no longer sets client mute: not transmitting looks dark (no talk), not muted; real mute stays a separate mic toggle

2.2.9:
- Fix local mute/volume/latency for users and music bots under native voice (settings were only applied to the unused WebAudio path)

2.2.8:
- Fix Push-to-Talk sticking open after release: native send enable/disable race + key-up ignored when modifiers differed; release remutes reliably (hold = talk, release = mute)

2.2.7:
- Fix Push-to-Talk actually transmitting: Space binding was saved as a literal space character and never matched; PTT now works while chat is focused; main-window key path + setPttHeld no longer no-ops

2.2.6:
- Fix complete UI freeze on startup: do not attach teaclient_ppt in the Electron main process (RIDEV_NOLEGACY Raw Input blocked keyboard/mouse for Chromium). Push-to-Talk still works in the focused window (Space by default)

2.2.5:
- Fix Push-to-Talk: wire native teaclient_ppt for global key capture (works while another window has focus), default key Space, stop persisting momentary unmute into audio prefs, sync mic send after connect
- Fix chat parity with oldclient: private chats keyed by unique id (survive reconnect), server chat (targetmode 3) sendable again, send/receive sounds and timestamps aligned
- Selecting a client who leaves the server now switches back to server info instead of polling getconnectioninfo (stops "Fehler (512): invalid clientID" spam)
* License label for hoster tier: "Authorized GreenTeaSpeak Host Provider"

2.2.4:
- Fix "too many clones connected (hwid)" on foreign TeaSpeak servers: every install now has its own hardware id instead of the shared static "gts2-native" (that made every GTS2 user look like the same machine)
- Untagged clientinit rejections are no longer silently swallowed — connect fails immediately with the real server message instead of hanging for 30s
+ Auto-improve identity security level when a server demands a higher level (0x207) and reconnect once

2.2.3:
- Fix joining foreign TeaSpeak servers that silently ignore the forum identity proof (no error, just a 20s timeout): any forum handshake failure now triggers the automatic retry with the GreenTeaSpeak identity
* Forum handshake timeouts reduced from 20s to 8s so the identity fallback kicks in quickly

2.2.2:
+ Client log files for diagnostics: every session writes a log to %APPDATA%/GreenTeaSpeak 2/logs (connection log, protocol/handshake output, errors, system info)
+ Menu entry Extras -> "Client Protokoll" (Ctrl+L) now opens the log folder
* Log housekeeping: keeps the last 10 files, 20 MB cap per file

2.2.1:
- Fix joining foreign TeaSpeak servers while logged into the forum: when a server rejects the forum identity, the client now automatically reconnects once with the GreenTeaSpeak identity (oldclient users had to switch profiles manually)
- Honest error message when a server cannot verify the forum identity (previously a misleading "please re-login to the forum")
- Fix "failed to resolve hostname" on domains that only have an SRV record: SRV lookup timeout raised from 600ms to 3s for slow DNS resolvers
* All visible product wording now says GreenTeaSpeak (identity labels, profile manager, error messages)

2.2.0:
! Third-party server support removed — TeaSpeak/GreenTeaSpeak is the only supported target
- Fix connect failures with normal (non-forum) identities: the TeaSpeak identity handshake now always runs (no legacy clientinit fallback)
+ Native file transfer implemented (raw TCP, oldclient wire protocol) — downloads and uploads work on native connections
+ Server group / channel group icons load again (ftinitdownload now sends seekpos=0 and proto=1 like the oldclient — fixes the "seekpos" parser kick)
+ File transfers use the SRV/DNS-resolved server host (fixes ENOTFOUND on domains without an A record)
+ Host banner sits above the channel tree like the oldclient: full width, aspect-ratio scaling, click opens the hostbanner URL, periodic gfx refresh, no placeholder without a banner
+ Connect dialog is a standalone window: compact by default, "More" reveals advanced settings, window height auto-fits the form
+ MusicBot "Add song" dialog (Enter song URL) replaces the browser prompt
+ MusicBot "Manage bot" opens the Playlist Manage window: name, channel commander, priority speaker, replay mode, max playlist size, delete played songs, song-change notification
+ Playlist Manage permissions tab: view/edit playlist permissions, client-specific permissions via uid/dbid search, list clients with own permissions
+ Saved microphone/audio settings are applied at client start (not only after opening the settings window)
* Icon download failures are logged in the main process console ([icons] ...)

2.1.8:
- Stop repeated "Fehler (256): command not found" spam on servers that do not support optional TeaSpeak commands
* Auto-disable unsupported optional commands per session (`setconnectioninfo`, `requeststreaminfo`) after first "command not found"
- Fix connect-time server kick "Invalid argument (failed to parse seekpos as m (stoull))" on affected TeaSpeak forks by skipping native remote icon file-transfer probes

2.1.7:
+ Settings list native miniaudio devices (voice:get-devices) instead of browser device ids — selections now reach the native voice backend
+ Device selection works before the first connect (standalone native controller) and saved devices are applied when native voice initializes
- Live input device switch: stop → set_device → start recorder cycle (oldclient pattern) — voice send no longer dies after changing the microphone
- "default" / stale device ids resolve to the real OS default device instead of failing silently
* Mic test maps the selected native device to the matching browser device by label

2.1.6:
+ Inline nickname rename in channel tree: click your own selected entry to edit (classic client style)
+ Server log entry when a client changes their nickname ("X changed his nickname from ...")
+ Local permission DB: catalog served from memory/disk snapshot, background refresh (oldclient-fast editor open)
+ Screen/camera share buttons are disabled with tooltip when b_video_screen / b_video_camera is missing
- Fix access violation (0xC0000005) on quit/disconnect: detach native callbacks, grace period before destroying the server connection
+ Main-process package @greentea/native-bridge (loader, NativeProtocolClient, NativeVoiceController)
+ Hardcoded PermissionType enum + group_mapping (1:1 oldclient) in @greentea/ipc-contracts
* Default transport/voice: honeybbq + WebAudio (native spawn_server_connection crashes on Electron 33; opt-in GTS_TRANSPORT=native)
* Native command stream: one notify row per event (fixes multi-user talking/mute/tree status)
* Native voice: register clients on enter, talking from playback state, skip renderer WebAudio
* Runtime diagnostics report real native load status; electron-builder packs native/build → resources/natives
* npm scripts: build-natives, rebuild-natives:clean, verify:native-abi
* Talking indicators in channel tree for all visible clients (oldclient), not only own channel
- Channel tree: subscribe + clientlist before UI "connected" (oldclient cold tree — no fake join trickle)
- Native clientlist: accumulate response rows for execCommandWithResponse
- Screen/camera share: use 1.6 Mbps default (oldclient); 4 Mbps exceeded i_video_max_kbps (2500) → permission 2568 for non-admins
- Updater: Accept-Encoding identity, gzip magic check, clearer errors for zlib "invalid block type"

2.1.5:
* HoneyBBQ: wrap diagnostics and always-ACK path kept (survives packet-id generation wrap with fixed server ACK match)
- Forum renew: use web-api/v1/renew&auth_key (works with fixed forum API)
* Online seit: live duration from client_lastconnected for users

2.1.4:
+ Modern favorites manager: search, grouped fields, connect in footer, Settings-aligned look
+ Modern identity/profiles window: side-by-side layout, status pills, German UI
+ Persist local client volume/mute/latency by unique ID (oldclient parity, per server)
* Keepalive: setconnectioninfo every 5s, whoami every 15s; quieter protocol logs (less audio hitch)
- VoiceSession: only re-apply output device / volume / latency when values change (avoid audio clicks)
- Updater: longer download timeout for large tar.gz (avoid truncated gzip / invalid stored block lengths)
- Fix client connection info all-zeros (concurrent getconnectioninfo notify collector race)
- Fix ~4h–7h disconnect "Packet resend failed": ACK every command by cleartext header id, even when decrypt fails at packet-id wrap
* HoneyBBQ: decrypt failures now logged (id/type/generation) instead of silently dropping the packet
* HoneyBBQ: wrap diagnostics — duplicate command re-delivery and send/recv generation changes logged with timestamps
* HoneyBBQ: receive window half-range (32768), circular isInWindow/isOldPacket, decrypt gen fallback ±4
- Forum identity: auto-renew via auth-key before connect (no hard 48h block while session is valid)
- Forum renew: correct API route (web-api/v1/renew with auth_key) — previous route returned 404, renew never worked

2.1.3:
+ Updater window like oldclient: installed vs latest version, download progress bar and log
+ Kick/Ban reason dialogs (Electron has no window.prompt — Cancel no longer kicks)
+ Modern settings shell: searchable sidebar, page headers, grouped cards, toggle switches
* Slow channel-tree clientlist poll from 10s to 20s to reduce command pressure
- Fix main-process crash ERR_SOCKET_BAD_PORT on UDP send after disconnect (HoneyBBQ safe send + ignore benign socket errors)
- Fix connect timeout: wait for identity-proof ACK before clientinit (TeaSpeak rejects early clientinit with not logged in)
- Clearer handshake errors (forum outdated / proof failed) instead of remapping every timeout to forum login
- Fix TeaSpeak handshake: use return_code so server emits proof ACK before clientinit

2.1.2:
+ Music bot: play channel files via ChannelProvider (Add file → file browser picker)
+ File browser: multi-select upload (upload several files in one go)
+ File browser: create folder via inline name field (Electron has no window.prompt)
+ File browser: upload/download progress bar (bytes + percent, multi-file index)
+ File browser opens in its own Electron window (like icon viewer / server list)
+ File browser: multi-select (Ctrl/Shift+click, Ctrl+A) for batch delete / bot playlist add
- Fix finished playlist songs sticking in the UI (handle notifyplaylistsongremove / replace on force reload)
- Fix connection drop "Packet resend failed" after long sessions (ACK wrap-around in GenerationWindow)
* HoneyBBQ patch: treat half-range packet IDs as old duplicates (oldclient parity)

2.1.1:
+ Responsive info panels (container queries) — detail views adapt when the window is not maximized
+ Modern microphone capture settings with TS3-style level meter (−50…+50, live fill, draggable threshold)
* Server tabs: hide tab strip with a single connection; show tabs from the second connection (oldclient)
* Mute system like oldclient: persist mute/deafen, copy state to new tabs, no force-mute on tab switch
- No microphone activated/muted WAV on connect or tab switch — only on explicit user toggle
- Fix music bot playlist not loading (always fetch clientinfo for client_playlist_id in full getBotInfo)
- Fix stale bot "now playing" title for radio streams (sync player_title / refresh live clientinfo)
- Fix command-queue lag from getconnectioninfo pollers (coalesce + cache, gentler UI intervals)
- Fix info panel flashing "Keine Auswahl" while bot/user/channel details are still loading

2.1.0:
+ Redesigned About dialog with Über / Copyright / Lizenz tabs (GreenTeaSpeak Systems branding)
+ Public server list window (Weblist API) with filters, sort, and connect — like the classic client
* Server list runs in its own Electron window; Weblist API is fetched only when that window opens
+ Show disconnect notice dialog when the server forces a leave
- Fix mute / talking / status icons missing after reconnect (e.g. server shutdown)
- Fix music bot talking indicator missing while playing (server talking=0 overwrote voice; sticky player_state)
- Fix music bot subscribe spam after reconnect ("Not running"); defer/retry quietly until protocol is ready
- Answer TeaSpeak notifyconnectioninforequest with setconnectioninfo (same recovery path as oldclient)
- Handle server disconnect immediately on notifyclientleftview (kick/ban/shutdown/timeout), like oldclient
- Fix kick: disconnect tab + show kick reason in log/dialog (was sound-only while staying connected)
- Fix badge configure dialog: equipped badges no longer vanish right after drop (click-after-drop + sync race)
- Fix connection timeout while muted / listening to music bots (extra whoami keepalive every 15s)
* Raise protocol packet idle timeout from 60s to 5 minutes when no UDP is received

2.0.9:
+ Forum badge configure UI (equip slots, redeem codes, team badge always on)
+ Badge changes sync to connected servers via client_badges and refresh the UI live
* Keepalive ping every 1s; resume from sleep probes whoami and reconnects if needed
* Channel edit sends only changed fields (avoids full channeledit permission failures)
- Fix badge dialog hang and connection stalls from awaited clientupdate on badge sync
- Fix connection-info polling spam after disconnect (invalid clientID / UDP not running)
- Stop falling back from SVG badges to leftover old PNG artwork

2.0.8:
+ Kick/ban shows who forced you offline and disconnects that tab (no auto-reconnect)
+ Channel kick notice when moved out of a channel
+ Hide ServerQuery clients (serveradmin) by default; show only with view power when enabled
* Channel tree load waits for channellistfinished and batches updates like the classic client
* Apply notifychannelmoved (parent/order) immediately instead of waiting for a poll
- Fix blank "Edit Virtual Server" window (undefined busy variable crash)

2.0.7:
+ Permission editor layout and categories 1:1 from oldclient (group_mapping)
+ Group icons in the permission editor sidebar
+ Icon picker (Edit / Remove / Add) opens Icon Viewer for groups, channels, and server edit
- Fix concurrent icons:list race ("Icon-Liste abgebrochen")

2.0.6:
+ Deep links (gts2server:// / teaclient://) auto-connect; new tab if already connected
* Forum login always sends forum handshake (status/badges) even with a normal identity selected
* Forum badges announced in clientinit so other clients can see them
- Remove unused "GreenTeaSpeak-ID senden" checkbox from Connect dialog

2.0.5:
+ Open gts2server:// (and teaclient://) deep links — fills Connect dialog with host/port
+ Protocol handler registers on packaged installs (Setup) and launches existing instance
* Invite link copy uses gts2server:// instead of ts3server://

2.0.4:
- Protocol client_version now follows package/app-info (no more hardcoded 2.0.0 Alpha)
- Channel edit loads type/limits/advanced flags from channellist cache like the classic client
- Channel needed file powers use correct i_ft_needed_* permission names
- Treat sql no modifications (1283) as success on channel save
- Server chat tab is log-only (not writable)
- Double-click another client opens client-to-client chat
+ Chat context menu (copy, select all, emoticons, line markers, clear)
+ Emoji picker (emoji-mart) on the chat input
+ Changelog dialog under Help ("Changelog lesen")
+ Modern client / channel / server detail panels
* Host banner keeps aspect ratio and crops at the bottom like Tea(*)Speak
* Music bot playlist UI with context menu (play, copy URL, delete)
* Chat background gray; timestamps on all chat lines including system messages
* Channel-edit sound always plays after a successful local channel save

2.0.3:
- Server nicknames: resolve via public directory cache (encrypted local store, ETag refresh)
- Connect shows nickname in UI/log; real host used only internally (DNS prefetched to IP)
- Faster connect path (earlier "connected", post-handshake work in background)
- Voice capture IPC fix (no more invalid transfer / duplicate AudioWorklet errors)
- Play connection.connected on join instead of channel.edited during bootstrap
- DevTools via F12 / Ctrl+Shift+I

2.0.2:
- Away status like the classic client (toolbar toggle, dropdown, away message, tree icon)
- Connect to another server in a new tab (multi-connection tabs)
- Bookmark context menu: Connect, Connect in new tab, Edit favorite
- Cleaner disconnected layout (same proportions as connected, no leftover chat tabs)

2.0.1:
- Hide Query/Template groups unless b_serverinstance_modify_querygroup / modify_templates
- Show server/channel group names in the tree when i_group_show_name_in_tree is Front or Behind
- Editable nickname per bookmark in Favorites manager
- Server "Online since" uses real uptime instead of a placeholder

2.0.0:
+ Secure preload IPC with context isolation and sandbox
+ GreenTeaSpeak-style UI with channel tree, context info, event log and channel chat
+ Client updater via clientapi.greenteaspeak.de/gts2/api.php (setup-installer package)
+ Automatic reconnect after timeout or server drop
+ Classic connection log (host/welcome messages) and poke send/receive dialogs
+ Bookmark management, DNS SRV resolution and persistent server banner support
+ Forum identity with RSA verification, voice, whisper and media foundations
+ Server edit window, icon viewer, and improved client/server details
